from fastapi import FastAPI
import redis
import redis.asyncio as aioredis
import asyncio
import time
# 创建 FastAPI 应用实例
app = FastAPI()
# 配置两个 Redis 同步客户端，连接到同一个 Redis 服务（localhost:6379）
redis_clients_sync = [
    redis.StrictRedis(host='localhost', port=6379, decode_responses=True),  # 第一个同步客户端
    redis.StrictRedis(host='localhost', port=6379, decode_responses=True),  # 第二个同步客户端
]
# 配置两个 Redis 异步客户端，连接到同一个 Redis 服务（localhost:6379）
redis_clients_async = [
    aioredis.Redis(host='localhost', port=6379, decode_responses=True),     # 第一个异步客户端
    aioredis.Redis(host='localhost', port=6379, decode_responses=True),     # 第二个异步客户端
]
TOTAL = 500  # 每个 Redis 实例写入的 key 数量
@app.get("/sync_write")
def sync_write():
    """
    同步写入接口
    依次向两个同步 Redis 客户端写入 TOTAL 条数据
    """
    start = time.time()  # 记录开始时间
    for i in range(TOTAL):
        # 往第一个 Redis 客户端写入 key，格式为 redis1:user:i
        redis_clients_sync[0].set(f"redis1:user:{i}", f"value{i}")
        # 往第二个 Redis 客户端写入 key，格式为 redis2:user:i
        redis_clients_sync[1].set(f"redis2:user:{i}", f"value{i}")
    duration = round(time.time() - start, 2)  # 计算总耗时（秒）
    return {"message": "同步写入完成", "duration_seconds": duration}
@app.get("/async_write")
async def async_write():
    """
    异步写入接口
    并发向两个异步 Redis 客户端写入 TOTAL 条数据
    """
    start = time.time()  # 记录开始时间
    tasks = []
    for i in range(TOTAL):
        # 创建写入第一个 Redis 客户端的协程任务，key 格式为 redis1:user:i
        tasks.append(redis_clients_async[0].set(f"redis1:user:{i}", f"value{i}"))
        # 创建写入第二个 Redis 客户端的协程任务，key 格式为 redis2:user:i
        tasks.append(redis_clients_async[1].set(f"redis2:user:{i}", f"value{i}"))
    # 并发执行所有写入操作
    await asyncio.gather(*tasks)
    duration = round(time.time() - start, 2)  # 计算总耗时（秒）
    # 关闭所有异步客户端连接（可选，长连接模式可不关闭）
    await asyncio.gather(*[client.aclose() for client in redis_clients_async])
    return {"message": "异步写入完成", "duration_seconds": duration}

# 运行 FastAPI 应用的主函数（可直接用 uvicorn 启动，也可以通过此函数启动）
if __name__ == "__main__":
    import uvicorn
    # 启动 uvicorn 服务器，监听 8000 端口，自动重载（开发环境用）
    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)# 此处的这个main需要改写,根据具体的实际情况来处理
